#include "wx/wxprec.h"
#include "wx/msgout.h"
#include "wx/apptrait.h"
#include <stdarg.h>
#include <stdio.h>

#if wxUSE_BASE

wxMessageOutput* wxMessageOutput::ms_msgOut = 0;

wxMessageOutput* wxMessageOutput::Get() {
  if( !ms_msgOut && wxTheApp ) {
    ms_msgOut = wxTheApp->GetTraits()->CreateMessageOutput();
  }
  return ms_msgOut;
}

wxMessageOutput* wxMessageOutput::Set( wxMessageOutput* msgout ) {
  wxMessageOutput* old = ms_msgOut;
  ms_msgOut = msgout;
  return old;
}

void wxMessageOutputBest::Printf( const wxChar* format, ... ) {
  va_list args;
  va_start( args, format );
  wxString out;
  out.PrintfV( format, args );
  va_end( args );
  {
    fprintf( stderr, "%s", ( const char* ) out.mb_str() );
  }
}

void wxMessageOutputStderr::Printf( const wxChar* format, ... ) {
  va_list args;
  va_start( args, format );
  wxString out;
  out.PrintfV( format, args );
  va_end( args );
  fprintf( stderr, "%s", ( const char* ) out.mb_str() );
}

void wxMessageOutputDebug::Printf( const wxChar* format, ... ) {
  wxString out;
  va_list args;
  va_start( args, format );
  out.PrintfV( format, args );
  va_end( args );
  #if defined(__WXMSW__) && !defined(__WXMICROWIN__)
  out.Replace( wxT( "\t" ), wxT( "        " ) );
  out.Replace( wxT( "\n" ), wxT( "\r\n" ) );
  ::OutputDebugString( out );
  #elif defined(__WXMAC__) && !defined(__DARWIN__)
  if( wxIsDebuggerRunning() ) {
    Str255 pstr;
    wxString output = out + wxT( ";g" ) ;
    wxMacStringToPascal( output.c_str(), pstr );
    #ifdef __powerc
    DebugStr( pstr );
    #else
    SysBreakStr( pstr );
    #endif
  }
  #else
  wxFputs( out, stderr ) ;
  if( out.Right( 1 ) != wxT( "\n" ) ) {
    wxFputs( wxT( "\n" ), stderr ) ;
  }
  fflush( stderr ) ;
  #endif // platform
}

void wxMessageOutputLog::Printf( const wxChar* format, ... ) {
  wxString out;
  va_list args;
  va_start( args, format );
  out.PrintfV( format, args );
  va_end( args );
  out.Replace( wxT( "\t" ), wxT( "        " ) );
  ::wxLogMessage( wxT( "%s" ), out.c_str() );
}

#endif // wxUSE_BASE

#if wxUSE_GUI
void wxMessageOutputMessageBox::Printf( const wxChar* format, ... ) {
  va_list args;
  va_start( args, format );
  wxString out;
  out.PrintfV( format, args );
  va_end( args );
  wxString title;
  if( wxTheApp ) {
    title.Printf( _( "%s 消息" ), wxTheApp->GetAppName().c_str() );
  }
  ::wxMessageBox( out, title );
}
#endif
